サーバー上でのサードパーティライブラリを使用 On the server, with third-party libraries
サーバー上でサードパーティのライブラリを使ってデータ取得する場合、
リクエストの出力はキャッシュされず、セグメントがレンダリングされるたびにリクエストが再フェッチされる。
code:app/utils.ts
import { cache } from 'react'
// Reactのキャッシュ機能がデータリクエストをメモ化するために使われている
export const getItem = cache(async (id: string) => {
const item = await db.item.findUnique({ id })
return item
})
code: app/item/id/layout.tsx import { getItem } from '@/utils/get-item'
// レイアウトで再検証オプションが3600に設定
export const revalidate = 3600 // 最大毎時データを再検証
export default async function Layout({ params: { id } }: { params: { id: string } }) {
const item = await getItem(id)
// ...
}
code: app/item/id/page.tsx import { getItem } from '@/utils/get-item'
// ページでも再検証オプションが3600に設定
export const revalidate = 3600 // 最大毎時データを再検証
export default async function Page({ params: { id } }: { params: { id: string } }) {
const item = await getItem(id)
// ...
}
getItem関数が2回呼ばれても、データベースへのクエリは一度だけ行われる。これで、データ取得の効率がぐんと上がる。
? どういうこと?
Layoutとpageって、実質的に同じページだから、別に一回呼ぶでいいんじゃないの?2回呼ぶ必要あるの?
componentの都合上、それぞれで呼ばないといけないけど、cache Reactで包んでいるから、1回しか呼ばれないという理解であってる? fetchCache: 'auto' | 'default-cache' | 'only-cache' | 'force-cache' | 'force-no-store' | 'default-no-store' | 'only-no-store'